package com.xuecheng.manage_cms_client.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: gongfy
 * @create: 2020/7/16 9:53
 * @Description: MQ配置类
 */
@Configuration // 指定该类是一个配置类，相当于一个<bean>标签 spring容器在启动的时候会扫描到这个bean  会把这个bean注册到ioc容器中
public class RabbitmqConfig {

    // 队列bean的名称
    public static final String QUEUE_CMS_POSTPAGE = "queue_cms_postpage";
    //交换机名称
    public static final String EX_ROUTING_CMS_POSTPAGE = "ex_routing_cms_postpage";

    //队列的名称
    @Value("${xuecheng.mq.queue}") // @Value注入基本数据类型和String类型的数据  todo 取不到值怎么设置默认值?
    public String queue_cms_postpage_name;

    //routingKey 即站点Id
    @Value("${xuecheng.mq.routingKey}")
    public String routingKey;

     /*
     *  1.声明交换机：交换机配置使用direct类型  @return the exchange
     * */
     @Bean(EX_ROUTING_CMS_POSTPAGE)
     public Exchange exchangeDeclare(){
         return ExchangeBuilder.directExchange(EX_ROUTING_CMS_POSTPAGE).durable(true).build();
     }

    // 2.声明队列  todo 为什么不用QueueBuilder?
    @Bean(QUEUE_CMS_POSTPAGE)
    public Queue queueDeclare(){
         return new Queue(queue_cms_postpage_name);
    }

    /*
    *  3.绑定队列给交换机：
    *  @param queue   @param exchange  @return Binding
    *  @Qualifier 在自动按照类行注入的基础之上，在按照bean的id注入。它在给字段注入时不能独立使用，必须和@Autowire一起使用，但是给参数注入时，可以独立使用。
    * */
    @Bean // 没有@Bean注解 就没有绑定
    public Binding bindQueueToExchange(@Qualifier(QUEUE_CMS_POSTPAGE) Queue queue,
                                       @Qualifier(EX_ROUTING_CMS_POSTPAGE) Exchange exchange ){

        return BindingBuilder.bind(queue).to(exchange).with(routingKey).noargs();
    }
}
